﻿package core;


// ======================================= Класс перевода величин в байт-массивы
//### Добавить возможность проверки и динамического наращивания очереди

public class ToBytes {

//==================================================================== Константы


//=================================================================== Переменные
//Очередь
private byte[] query; // Очередь компонентов сообщения в виде массива
//private ByteBuffer query; // Обертка очереди
private int lenP = -1; // Номер в очереди для вставки длины
private int len; // Общая длина очереди, байт


//================================================================ Инициализация
public ToBytes(int maxLen) {

	query = new byte[maxLen];
	//	query = ByteBuffer.allocate(Setting.MAX_MESS_LEN);
}


//============================================================ Вернуть результат
public byte[] getBytes() {

	int resLen = len;
	byte[] result;

	if (lenP >= 0) { // Требуется вставка длины
		int lenLen = Mat.getIntLen(len - lenP - 1);
		resLen += (lenLen - 1);
		result = new byte[resLen];
		System.arraycopy(query, 0, result, 0, lenP);
		putInt(result, lenP, len - lenP - 1);
		lenP++;
		System.arraycopy(query, lenP, result, resLen - (len - lenP), len - lenP);
	} else { // Длина не требуется
		result = new byte[resLen];
		System.arraycopy(query, 0, result, 0, len);
	}


	return result;
}


//============================================================== Записать булево
public void putBool(boolean bool) {

	if (bool) {
		putInt(1);
	} else {
		putInt(0);
	}
}


// ============================================================== Отправить байт
public void putByte(byte byt) {

	query[len++] = byt;
}


// ======================================================== Записать байт-массив
public void putBytes(byte[] bytes) {

	System.arraycopy(bytes, 0, query, len, bytes.length);
	len += bytes.length;
}


//=============================================================== Записать целое
public void putInt(int number) {

	// Первый байт - младший
	do {
		query[len] = (byte) (number & 0x7f);
		number >>>= 7;
		if (number > 0) {
			query[len] |= 0x80;
		}
		len++;
	} while (number > 0);
}


//=============================================================== Записать целое
public void putInt(byte[] bytes, int position, int number) {

	// Первый байт - младший
	do {
		bytes[position] = (byte) (number & 0x7f);
		number >>>= 7;
		if (number > 0) {
			bytes[position] |= 0x80;
		}
		position++;
	} while (number > 0);
}


// ============================================================= Место для длины
public void putLen() {

	lenP = len++;
}


// ============================================================= Записать строку
public void putString(String text) {

	if (text != null) {
		putInt(text.length());
		putBytes(Mat.utf2iso(text));
	} else {
		putInt(0);
	}
}


}
